package com.hmily.dubbo.consumer.async;

import com.hmily.dubbo.api.async.AsyncUserQueryFacade;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.rpc.RpcContext;

import java.util.concurrent.CompletableFuture;
import java.util.function.BiConsumer;

/**
 * <h1>通过 getCompletableFuture 调用等待结果.</h1>
 *
 * @author hmilyylimh
 *         ^_^
 * @version 0.0.1
 *         ^_^
 * @date 2021-10-20
 *
 */
public class AsyncGetCompletableFutureResultApplication {

    public static void main(String[] args) throws Exception {
        // 设置应用服务名称
        ApplicationConfig applicationConfig = new ApplicationConfig("dubbo-consumer");
        // 设置注册中心的地址
        RegistryConfig registryConfig = new RegistryConfig("zookeeper://127.0.0.1:2181");

        // 创建引用 AsyncUserQueryFacade 这个服务的对象
        ReferenceConfig<AsyncUserQueryFacade> referenceConfig = new ReferenceConfig<>();
        referenceConfig.setApplication(applicationConfig);
        referenceConfig.setRegistry(registryConfig);
        referenceConfig.setInterface(AsyncUserQueryFacade.class);
        referenceConfig.setTimeout(12000);
        // 真正开启异步化操作，让调用方可以通过 Future 来拿到最终的结果
        referenceConfig.setAsync(true);

        // 直接拿到引用的代理对象，然后进行远程调用
        AsyncUserQueryFacade asyncUserQueryFacade = referenceConfig.get();
        // 既然是异步化操作获取结果，那么下面这行代码会有结果么？？？
        System.out.println("注定拿不到结果: " + asyncUserQueryFacade.queryUserById("G314"));

        CompletableFuture<Object> completableFuture = RpcContext.getContext().getCompletableFuture();
        completableFuture.whenComplete((result, e) -> {
            if(e == null){
                // 拿到一个 Future 对象，这个 Future 对象哪里来呢？其实是从 RpcContext 远程调用上下文中获取得到的
                System.out.println("注定可以拿到结果: " + result);
            } else {
                System.out.println("非常意外走到了异常分支: " + e.getLocalizedMessage());
            }
        });

        // 阻塞等待
        System.in.read();
    }
}
